<?php
/**
 *  BaseDeDatos ejecuta las sentencias SQL sobre la BaseDeDatos 
 *  configurada devolviendo los resultados.
 *
 *  Clase que se encarga de mediadora con la Base De Datos
 *  de ahí el nombre TAN original
 *
 * @author Iuga 2008 iuga77@gmail.com
 * @license Creative Commons 3.0 Argentina 3.0
 * @version    1.0
 * @link       http://www.k0d3rs.com.ar
 */

require_once("SConfig.class.php");
require_once("ISingleton.class.php");

class BaseDeDatos implements ISingleton
{
        static private $conexion = null;
	private $conn;   // Contiene el enlace a la Base de datos  
        private $host;   // Nombre de HOST o IP del servidor
        private $usuario;// Nombre de usuario
        private $pass;   // Password asignado
        private $bd;     // Nombre de la Base De Datos (Esquema a utilizar)
	
    /**
     * Constructor, no recibe parametros, pero setea los valores de conexion
     * Los obtiene de IConfig
     */
    private function BaseDeDatos()
    {
         	$this->host    =  SConfig::getInstance()->getData("bdHost");
		$this->usuario =  SConfig::getInstance()->getData("bdUsuario");
		$this->pass    =  SConfig::getInstance()->getData("bdPass");
		$this->bd      =  SConfig::getInstance()->getData("bdBd");
		// Me conecto !!
                try
                {
                    $this->Conectar();
                }catch(Exception $e)
                {
                    trigger_error($e->getMessage());
                }
    }

    /**
     * Aplico el patrón Singleton para mantener solo una conexión
     * abierta por vez.
     */
    static public function getInstance() 
    {
        if(self::$conexion == null)
        {
           self::$conexion = new BaseDeDatos();
        }
        return self::$conexion;
    }    
    
    /**
     * Realiza la conexión a la Base de datos
     * @return $conexion
     */
    private function Conectar()
    {
            if(isset($this->conn))
            {
                return $this->conn;
            }
            //Me conecto ...
            $conexion = mysql_connect($this->host, $this->usuario, $this->pass);     
            if($conexion)
            {
                    // Como ya me conecte abro el Esquema
                    if(!mysql_select_db($this->bd, $conexion))
                    {
                            die("<b>Error: </b><i>No existe el esquema dentro de la Base de datos</i><br>".mysql_error());
                    }
                    $this->conn = $conexion;
                    return $conexion;	
            }
            else
            {
                    throw new Exception("No se pudo conectar a la Base de datos ".mysql_error());
            }    
    }
    
    /**
     * Realiza una consulta a la base de datos, recibe por parametro la sentencia SQL 1-2
     * y devuelve el link a la respuesta
     * @param string $sql
     * @return mysqlRes $res
     */
    public function Query($sql)
    {
            if($res = mysql_query($sql, $this->conn))
            {

                    return $res;
            }
            else
            {
                    //
                    echo $sql;
                    trigger_error(mysql_error());
                    //
                    return false;
            }
    }
    
    /**
     * Realiza una consulta a la base de datos, recibe por parametro la sentencia SQL 1-2
     * y devuelve si fue exitosa o no, SOLO SE USA EN LOS INSERTS, DELETES Y UPDATES, ya que
     * no retorna valores
     *
     * @param string $sql
     * @return boolean $exito
     */
    public function NaNQuery($sql)
    {
            if($res = mysql_query($sql, $this->conn))
            {
                    return true;
            }
            else
            {
                    return false;
            }
    }

    /**
     * Lee un objeto del array de objetos que trajo Query
     * Opcional: (castearlo)
     * @param mysqlRes $res
     * @return object $obj
     */
    public function leerObjeto($res)
    {
            $obj = mysql_fetch_object($res);
            return $obj;
    }
	
    /**
     * Devuelve el id del objeto que se acaba de crear
     * @return variant $id
     */
    public function IdInsertado()
    {
            return mysql_insert_id();
    }
	
    /**
     * Retorna la cantidad de objetos que trajo la consulta
     * @param  mysqlRes $res
     * @return int $cantidadObjetos
     */
    public function getNumObjetos($res)
    {
            return mysql_num_rows($res);
    }
	
	
    /**
     * Escape escapa literalmente las cadenas de texto que van a ser almacenadas en la base de datos.
     * Usarla siempre !!!
     * @param string $cadena
     * @return string $cadenaSegura
     */
    public function Escape($cadena)
    {
            return mysql_real_escape_string($cadena);
    }
	
    /**
     * Deshace los posibles cambios generados con Escape()
     * Usarla siempre que se uso Escape()
     *
     * @param string $cadenaSegura
     * @return $cadena
     */
    public function UnEscape($cadena)
    {
            return stripcslashes($cadena);
    }

    /**
     * Se Desconecta de la base de datos
     */
    public function Desconectar()
    {
            mysql_close();
    }
}

/**
 * Links de interes:
 * http://blog.carlosmayo.net/2008/04/patrones-de-diseo-singleton.html
 */

?>